#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

//typedef struct {
//    int* a;
//    int front;
//    int rear;
//    int k;
//} MyCircularQueue;
//
//bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
//    assert(obj);
//
//    if (obj->rear == obj->front)
//        return true;
//    return false;
//}
//
//bool myCircularQueueIsFull(MyCircularQueue* obj) {
//    assert(obj);
//
//    return (obj->rear + 1) % (obj->k + 1) == obj->front;
//}
//
//MyCircularQueue* myCircularQueueCreate(int k) {
//    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
//    obj->a = (int*)malloc(sizeof(int) * (k + 1));
//    obj->front = 0;
//    obj->rear = 0;
//    obj->k = k;
//    return obj;
//}
//
//bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
//    assert(obj);
//
//    if (!myCircularQueueIsFull(obj))
//    {
//        obj->a[obj->rear++] = value;
//        if (obj->rear == obj->k + 1)
//        {
//            obj->rear = 0;
//        }
//        return true;
//    }
//    else
//    {
//        return false;
//    }
//}
//
//bool myCircularQueueDeQueue(MyCircularQueue* obj) {
//    assert(obj);
//
//    if (!myCircularQueueIsEmpty(obj))
//    {
//        obj->front++;
//        if (obj->front == obj->k + 1)
//        {
//            obj->front = 0;
//        }
//        return true;
//    }
//    else
//    {
//        return false;
//    }
//}
//
//int myCircularQueueFront(MyCircularQueue* obj) {
//    assert(obj);
//
//    if (myCircularQueueIsEmpty(obj))
//    {
//        return -1;
//    }
//
//    return obj->a[obj->front];
//}
//
//int myCircularQueueRear(MyCircularQueue* obj) {
//    assert(obj);
//
//    if (myCircularQueueIsEmpty(obj))
//    {
//        return -1;
//    }
//
//    if (obj->rear == 0)
//    {
//        return obj->a[obj->k];
//    }
//    else
//    {
//        return obj->a[obj->rear - 1];
//    }
//}
//
//void myCircularQueueFree(MyCircularQueue* obj) {
//    assert(obj);
//
//    free(obj->a);
//    free(obj);
//}

/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);

 * bool param_2 = myCircularQueueDeQueue(obj);

 * int param_3 = myCircularQueueFront(obj);

 * int param_4 = myCircularQueueRear(obj);

 * bool param_5 = myCircularQueueIsEmpty(obj);

 * bool param_6 = myCircularQueueIsFull(obj);

 * myCircularQueueFree(obj);
*/